1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
| CREATE DATABASE Склад_1201 -- Вместо ХХХ подставьте свою комбинацию цифр
ON PRIMARY -- Путь D:\Work\X7230XXX\ к файлам
( NAME = Склад_data, -- базы данных уже должен существовать
FILENAME = 'C:\Work\57230120\Склад_1201_data.mdf',
SIZE = 5MB,
MAXSIZE = 75MB,
FILEGROWTH = 3MB ),
FILEGROUP Secondary
( NAME = Склад2_data,
FILENAME = 'C:\Work\Склад_1201_data2.ndf',
SIZE = 3MB,
MAXSIZE = 50MB,
FILEGROWTH = 15% ),
( NAME = Склад3_data,
FILENAME = 'C:\Work\Склад_1201_data3.ndf',
SIZE = 4MB,
FILEGROWTH = 4MB )
LOG ON
( NAME = Склад_log,
FILENAME = 'C:\Work\Склад_1201_log.ldf',
SIZE = 1MB,
MAXSIZE = 10MB,
FILEGROWTH = 20% ),
( NAME = Склад2_log,
FILENAME = 'C:\Work\Склад_1201_log2.ldf',
SIZE = 512KB,
MAXSIZE = 15MB,
FILEGROWTH = 10% )
GO
USE Склад_1201
GO
CREATE RULE Logical_rule AS @VALUE IN ('Нет', 'Да')
GO
CREATE DEFAULT Logical_default AS 'Нет'
GO
EXEC sp_addtype Logical, 'char(3)', 'NOT NULL'
GO
EXEC sp_bindrule 'Logical_rule', 'Logical'
GO
EXEC sp_bindefault 'Logical_default', 'Logical'
GO
/* Регион */
CREATE TABLE Регион ( /* первая команда пакета */
КодРегиона INT PRIMARY KEY,
Страна VARCHAR(20) DEFAULT 'Беларусь' NOT NULL,
Область VARCHAR(20) NOT NULL,
Город VARCHAR(20) NOT NULL,
Адрес VARCHAR(50) NOT NULL,
Телефон CHAR(15) NULL,
Факс CHAR(15) NOT NULL CONSTRAINT CIX_Регион2
UNIQUE ON Secondary,
CONSTRAINT CIX_Регион UNIQUE (Страна, Область, Город, Адрес)
ON Secondary
)
/* Поставщик */
CREATE TABLE Поставщик ( /* вторая команда пакета */
КодПоставщика INT PRIMARY KEY,
ИмяПоставщика VARCHAR(40) NOT NULL,
УсловияОплаты VARCHAR(30) DEFAULT 'Предоплата' NULL,
КодРегиона INT NULL,
Заметки VARCHAR(MAX) NULL,
CONSTRAINT FK_Поставщик_Регион FOREIGN KEY (КодРегиона)
REFERENCES Регион ON UPDATE CASCADE
)
/* Клиент */
CREATE TABLE Клиент ( /* третья команда пакета */
КодКлиента INT IDENTITY(1,1) PRIMARY KEY,
ИмяКлиента VARCHAR(40) NOT NULL,
ФИОРуководителя VARCHAR(60) NULL,
КодРегиона INT NULL,
CONSTRAINT FK_Клиент_Регион FOREIGN KEY (КодРегиона)
REFERENCES Регион ON UPDATE CASCADE
)
/* Валюта */
CREATE TABLE Валюта ( /* четвертая команда пакета */
КодВалюты CHAR(3) PRIMARY KEY,
ИмяВалюты VARCHAR(30) NOT NULL,
ШагОкругления NUMERIC(10, 4) DEFAULT 0.01 NULL
CHECK (ШагОкругления IN (50, 1, 0.01)),
КурсВалюты SMALLMONEY NOT NULL CHECK (КурсВалюты > 0)
)
/* Товар */
CREATE TABLE Товар ( /* пятая команда пакета */
КодТовара INT PRIMARY KEY,
Наименование VARCHAR(50) NOT NULL,
ЕдиницаИзм CHAR(10) DEFAULT 'штука' NULL,
Цена MONEY NULL CHECK (Цена > 0),
КодВалюты CHAR(3) DEFAULT 'BYR' NULL,
Расфасован LOGICAL NOT NULL,
CONSTRAINT FK_Товар_Валюта FOREIGN KEY (КодВалюты)
REFERENCES Валюта ON UPDATE CASCADE
)
/* Заказ */
CREATE TABLE Заказ ( /* шестая команда пакета */
КодЗаказа INT IDENTITY(1,1) NOT NULL,
КодКлиента INT NOT NULL,
КодТовара INT NOT NULL,
Количество NUMERIC(12, 3) NULL CHECK (Количество > 0),
ДатаЗаказа DATETIME DEFAULT getdate() NULL,
СрокПоставки DATETIME DEFAULT getdate() + 14 NULL,
КодПоставщика INT NULL,
PRIMARY KEY (КодЗаказа, КодКлиента, КодТовара),
CONSTRAINT FK_Заказ_Товар FOREIGN KEY (КодТовара)
REFERENCES Товар ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT FK_Заказ_Клиент FOREIGN KEY (КодКлиента)
REFERENCES Клиент ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT FK_Заказ_Поставщик FOREIGN KEY (КодПоставщика)
REFERENCES Поставщик
)
GO
CREATE UNIQUE INDEX UIX_Поставщик ON Поставщик (ИмяПоставщика)
ON Secondary
CREATE UNIQUE INDEX UIX_Клиент ON Клиент (ИмяКлиента)
ON Secondary
CREATE UNIQUE INDEX UIX_Валюта ON Валюта (ИмяВалюты)
ON Secondary
CREATE UNIQUE INDEX UIX_Товар ON Товар (Наименование)
ON Secondary
CREATE INDEX IX_Регион ON Регион (Страна, Город) ON Secondary
CREATE INDEX IX_Товар ON Товар (ЕдиницаИзм, Наименование)
ON Secondary
CREATE INDEX IX_Заказ ON Заказ (ДатаЗаказа) ON Secondary
GO
INSERT INTO Регион
VALUES (101, 'Россия', 'Московская', 'Королев', 'ул.Мира, 15',
'387-23-04', '387-23-05')
INSERT INTO Регион (КодРегиона, Область, Город, Адрес, Факс)
VALUES (201, '', 'Минск', 'ул.Гикало, 9', '278-83-88')
INSERT INTO Регион (КодРегиона, Область, Город, Адрес, Факс)
VALUES (202, 'Минская', 'Воложин', 'ул.Серова, 11', '48-37-92')
INSERT INTO Регион (КодРегиона, Область, Город, Адрес, Телефон,
Факс)
VALUES (203, '', 'Минск', 'ул.Кирова, 24', '269-13-76',
'269-13-77')
INSERT INTO Регион (КодРегиона, Область, Город, Адрес, Факс)
VALUES (204, 'Витебская', 'Полоцк', 'ул.Лесная, 6', '48-24-12')
INSERT INTO Регион
VALUES (301, 'Украина', 'Крымская', 'Алушта', 'ул.Франко, 24',
NULL, '46-49-16')
GO
INSERT INTO Поставщик
VALUES (123, 'ЗАО Магистраль', 'Предоплата', 101,
NULL)
INSERT INTO Поставщик
VALUES (234, 'ЗАО Алхимик', 'Предоплата', 101,
NULL)
INSERT INTO Поставщик
VALUES (345, 'ЗАО Шиномонтаж', 'Предоплата', 201,
NULL)
INSERT INTO Поставщик
VALUES (456, 'ЗАО Автомойка', 'Предоплата', 202,
NULL)
INSERT INTO Поставщик
VALUES (567, 'СП ”Полихим”', 'По факту отгрузки', 203,
'Постоянный поставщик')
GO
INSERT INTO Клиент
VALUES ('ГП ”Верас”', 'Прокушев Станислав Игоревич', 202)
INSERT INTO Клиент
VALUES ('ГП ”Мираж”', 'Сидоров Иван Игоревич', 201)
INSERT INTO Клиент
VALUES ('ГП ”Кураж”', 'Петров Петр Игоревич', 203)
INSERT INTO Клиент
VALUES ('ГП ”Шестеренка”', 'Иванов Алексей Игоревич', 101)
INSERT INTO Клиент (ИмяКлиента, ФИОРуководителя)
VALUES ('ИП ”Темп”', 'Васько Григорий Терентьевич')
GO
INSERT INTO Валюта
VALUES ('BYR', 'Белорусские рубли', 1, 1)
INSERT INTO Валюта (КодВалюты, ИмяВалюты, КурсВалюты)
VALUES ('RUR', 'Российские рубли', 276)
INSERT INTO Валюта (КодВалюты, ИмяВалюты, КурсВалюты)
VALUES ('USD', 'Доллары США', 9160)
INSERT INTO Валюта (КодВалюты, ИмяВалюты, КурсВалюты)
VALUES ('EUR', 'Евро', 12450)
GO
INSERT INTO Товар
VALUES (111, 'Монитор 21 дюйм', 'штука', 320, 'USD', 'Нет')
INSERT INTO Товар
VALUES (222, 'Телевизор 32 дюйм', 'штука', 520, 'USD', 'Нет')
INSERT INTO Товар
VALUES (333, 'Телефон 5 дюйм', 'штука', 220, 'USD', 'Нет')
INSERT INTO Товар
VALUES (444, 'Планшет 10 дюйм', 'штука', 300, 'USD', 'Нет')
INSERT INTO Товар (КодТовара, Наименование, Цена, Расфасован)
VALUES (555, 'Винчестер HDD 120GB', 285000, 'Да')
GO
SET DATEFORMAT dmy /* задаем привычный формат даты день.месяц.год, т.к.
по умолчанию установлен формат год.месяц.день */
INSERT INTO Заказ /* год можно задавать как 2-мя, так и 4-мя цифрами */
VALUES (3, 111, 8, '04.09.12', '14.09.12', 567)
INSERT INTO Заказ /* год можно задавать как 2-мя, так и 4-мя цифрами */
VALUES (3, 222, 8, '04.09.11', '14.09.11', 567)
INSERT INTO Заказ /* год можно задавать как 2-мя, так и 4-мя цифрами */
VALUES (2, 333, 8, '04.09.14', '14.09.14', 345)
INSERT INTO Заказ /* год можно задавать как 2-мя, так и 4-мя цифрами */
VALUES (2, 444, 8, '04.09.15', '14.09.15', 345)
INSERT INTO Заказ (КодКлиента, КодТовара, Количество)
VALUES (1, 555, 25)
GO
CREATE VIEW Запрос1 AS
SELECT TOP 100 PERCENT Товар.Наименование, Заказ.Количество,
Товар.ЕдиницаИзм, Поставщик.ИмяПоставщика
FROM Заказ
INNER JOIN Поставщик
ON Заказ.КодПоставщика = Поставщик.КодПоставщика
INNER JOIN Товар
ON Заказ.КодТовара = Товар.КодТовара
ORDER BY Товар.Наименование, Заказ.Количество DESC
GO
EXEC sp_grantlogin 'DARKSHADOW\sql1'
EXEC sp_grantlogin 'DARKSHADOW\sql2'
EXEC sp_grantlogin 'DARKSHADOW\sql3'
EXEC sp_grantlogin 'DARKSHADOW\sql4'
GO
EXEC sp_addsrvrolemember 'DARKSHADOW\sql1', 'dbcreator'
GO
EXEC sp_grantdbaccess 'DARKSHADOW\sql1', 'sql1'
EXEC sp_grantdbaccess 'DARKSHADOW\sql2', 'sql2'
EXEC sp_grantdbaccess 'DARKSHADOW\sql3', 'sql3'
EXEC sp_grantdbaccess 'DARKSHADOW\sql4', 'sql4'
GO
EXEC sp_addrole 'Гл.бухгалтер', 'sql1'
EXEC sp_addrole 'Бухгалтера', 'sql1'
EXEC sp_addrole 'Экономисты', 'sql1'
GO
EXEC sp_addrolemember 'db_accessadmin', 'sql1'
EXEC sp_addrolemember 'Гл.бухгалтер', 'sql1'
EXEC sp_addrolemember 'Бухгалтера', 'sql2'
EXEC sp_addrolemember 'Бухгалтера', 'sql3'
EXEC sp_addrolemember 'Бухгалтера', 'Гл.бухгалтер'
EXEC sp_addrolemember 'Экономисты', 'sql4'
EXEC sp_addrolemember 'Экономисты', 'Гл.бухгалтер'
GO
GRANT SELECT, INSERT, UPDATE, DELETE
ON Валюта TO [Гл.бухгалтер] WITH GRANT OPTION
GRANT UPDATE
ON Заказ TO [Гл.бухгалтер] WITH GRANT OPTION
GRANT SELECT
ON Запрос1 TO [Гл.бухгалтер] WITH GRANT OPTION
GRANT UPDATE, DELETE
ON Клиент TO [Гл.бухгалтер] WITH GRANT OPTION
GRANT UPDATE, DELETE
ON Поставщик TO [Гл.бухгалтер] WITH GRANT OPTION
GRANT UPDATE, DELETE
ON Товар TO [Гл.бухгалтер] WITH GRANT OPTION
GRANT SELECT, INSERT
ON Заказ TO Бухгалтера
GRANT SELECT, INSERT
ON Клиент TO Бухгалтера
GRANT SELECT, INSERT
ON Поставщик TO Экономисты
GRANT SELECT, INSERT
ON Товар TO Экономисты
GRANT SELECT, INSERT, UPDATE, DELETE
ON Регион TO public
GO
DENY UPDATE
ON Заказ (ДатаЗаказа, СрокПоставки) TO [Гл.бухгалтер] CASCADE
GO |