ServerName | DBName | Grantee | Owner | Object | ProtectType | SELECT | INSERT | UPDATE | DELETE | EXECUTE |
---|---|---|---|---|---|---|---|---|---|---|
MyServer | MyDB | ユーザー/ロール | dbo | テーブルA | Grant | (All+New) | TRUE | (All+New) | TRUE | |
MyServer | MyDB | ユーザー/ロール | dbo | テーブルB | Grant | (All+New) | TRUE | 列A | TRUE | |
MyServer | MyDB | ユーザー/ロール | dbo | テーブルB | Grant | (All+New) | TRUE | 列B | TRUE | |
MyServer | MyDB | ユーザー/ロール | dbo | ストアド | Grant | TRUE |
CREATE TABLE #sp_helprotect (
Owner sysname
,Object sysname
,Grantee sysname
,Grantor sysname
,ProtectType nvarchar(10)
,[Action] nvarchar(20)
,[COLUMN] nvarchar(128)
)
INSERT INTO #sp_helprotect EXEC sp_helprotect @permissionarea='o'
SELECT @@Servername AS ServerName,db_name() AS DBName,PK.Grantee,PK.Owner,PK.Object,PK.ProtectType
,CASE WHEN S.Grantee IS NULL THEN '' ELSE S.[SELECT] END AS [SELECT]
,CASE WHEN I.Grantee IS NULL THEN '' ELSE 'TRUE' END AS [INSERT]
,CASE WHEN U.Grantee IS NULL THEN '' ELSE U.[UPDATE] END AS [UPDATE]
,CASE WHEN D.Grantee IS NULL THEN '' ELSE 'TRUE' END AS [DELETE]
,CASE WHEN E.Grantee IS NULL THEN '' ELSE 'TRUE' END AS [EXECUTE]
FROM (
SELECT Grantee,Owner,Object,ProtectType
FROM #sp_helprotect
GROUP BY Grantee,Owner,Object,ProtectType
) AS PK
LEFT OUTER JOIN (
SELECT Grantee,Owner,Object,ProtectType,[COLUMN] AS [SELECT]
FROM #sp_helprotect
WHERE [Action] = 'SELECT'
) AS S
ON PK.Grantee=S.Grantee
AND PK.Owner=S.Owner
AND PK.Object=S.Object
AND PK.ProtectType=S.ProtectType
LEFT OUTER JOIN (
SELECT Grantee,Owner,Object,ProtectType
FROM #sp_helprotect
WHERE [Action] = 'INSERT'
) AS I
ON PK.Grantee=I.Grantee
AND PK.Owner=I.Owner
AND PK.Object=I.Object
AND PK.ProtectType=I.ProtectType
LEFT OUTER JOIN (
SELECT Grantee,Owner,Object,ProtectType,[COLUMN] AS [UPDATE]
FROM #sp_helprotect
WHERE [Action] = 'UPDATE'
) AS U
ON PK.Grantee=U.Grantee
AND PK.Owner=U.Owner
AND PK.Object=U.Object
AND PK.ProtectType=U.ProtectType
LEFT OUTER JOIN (
SELECT Grantee,Owner,Object,ProtectType
FROM #sp_helprotect
WHERE [Action] = 'DELETE'
) AS D
ON PK.Grantee=D.Grantee
AND PK.Owner=D.Owner
AND PK.Object=D.Object
AND PK.ProtectType=D.ProtectType
LEFT OUTER JOIN (
SELECT Grantee,Owner,Object,ProtectType
FROM #sp_helprotect
WHERE [Action] = 'EXECUTE'
) AS E
ON PK.Grantee=E.Grantee
AND PK.Owner=E.Owner
AND PK.Object=E.Object
AND PK.ProtectType=E.ProtectType
ORDER BY PK.Grantee,PK.Owner,PK.Object,PK.ProtectType
DROP TABLE #sp_helprotect
ファイル C:\WINDOWS\Microsoft.NET\Framework\ⶐ粕\mscorlib.tlb を読み込むことができませんでした。この状況を修復しようとしましたが、ファイルが見つからなかったため失敗しました。
Meaningless_string の部分は、エラー メッセージ中に表示される意味のない文字です。これらは、v1.0.3705、v1.1.4870、v2.0.50727 などの Microsoft .NET Framework のバージョン番号に類似する文字です。
IF UPDATE (msrepl_tran_version) RETURN
IF UPDATE(msrepl_tran_version) RETURN
SELECT sysobjects.name AS TableName , syscolumns.name AS ColumnName
FROM syscolumns
INNER JOIN sysobjects
ON sysobjects.id=syscolumns.id
WHERE sysobjects.xtype = 'U'
AND syscolumns.name LIKE '%tyo%'
SELECT ... INTO #DUMMY
FROM ...
IF @@ROWCOUNT > 0
BEGIN ...
CREATE PROCEDURE [dbo].[Select_LockStates] AS
CREATE TABLE #sp_lock (
spid nvarchar(64)
,dbid nvarchar(64)
,PbjID nvarchar(64)
,IndID nvarchar(64)
,TYPE nvarchar(64)
,Resource nvarchar(64)
,Mode nvarchar(64)
,STATUS nvarchar(64)
)
INSERT INTO #sp_lock EXEC sp_lock
CREATE TABLE #sp_who (
spid nvarchar(64)
,ecid nvarchar(64)
,STATUS nvarchar(64)
,loginname nvarchar(64)
,hostname nvarchar(64)
,blk nvarchar(64)
,dbname nvarchar(64)
,cmd nvarchar(64)
)
INSERT INTO #sp_who EXEC sp_who
SELECT *
FROM #sp_who
INNER JONI #sp_lock
ON #sp_who.spid=#sp_lock.spid
GO
LEFT CONVERT(VARCHAR(2), moji)
RIGHT REVERSE(CONVERT(VARCHAR(4), REVERSE(moji)))
DECLARE @moji VARCHAR(30)
DECLARE @one VARCHAR(1)
DECLARE @three VARCHAR(3)
SET @moji ='綺麗'
SELECT @one = CONVERT(VARCHAR(1), @moji)
SELECT @three = CONVERT(VARCHAR(3), @moji)
SELECT '基本文字列' AS TestCase , @moji AS String , DATALENGTH(CONVERT(VARCHAR(30), @moji)) AS Byte
UNION
SELECT '左から1バイト取得',@one,datalength(@one)
UNION
SELECT '左から3バイト取得',@three,datalength(@three)
TestCase | String | Byte |
基本文字列 | 綺麗 | 4 |
左から1バイト取得 | 0 | |
左から3バイト取得 | 綺 | 2 |
if update (msrepl_tran_version) return
CREATE TABLE #temp (
TABLE_NAME sysname,
ROWS sysname,
reserved sysname,
DATA VARCHAR(32),
index_size VARCHAR(254),
unused VARCHAR(100)
)
INSERT INTO #temp EXEC sp_MSforeachtable @command1 = "sp_spaceused '?'"
SELECT * FROM #temp ORDER BY TABLE_NAME
SELECT o.name, i.rows
FROM sysindexes AS i, sysobjects AS o
WHERE o.xtype = 'U' AND o.id = i.id AND i.indid < 2;
RAISERROR ('ここにメッセージ',0,1) RETURN
--こんな風に定義して
CREATE PROCEDURE [dbo].[GetNextID] (@KEY INT,@NEXTID INT OUTPUT) AS
UPDATE T_COUNTER SET F_ID = F_ID +1 WHERE F_KEY = @KEY
SELECT @NEXTID = F_ID FROM T_COUNTER WHERE F_KEY = @KEY
--こんな風に使う。
DECLARE @NEXTID INT
EXEC dbo.GetNextID 22,@NEXTID OUTPUT
PRINT @NEXTID
BEGIN TRANSACTION
DECLARE @RC INT
DECLARE @ERR INT
UPDATE ...
SELECT @RC=@@ROWCOUNT,@ERR=@@ERROR --必ず実行した直後に
IF @ERR<>0
BEGIN
ROLLBACK TRANSACTION
RETURN @ERR
END
IF @RC=0
BEGIN
INSERT ...
SELECT @RC=@@ROWCOUNT,@ERR=@@ERROR --必ず実行した直後に
IF @ERR<>0
BEGIN
ROLLBACK TRANSACTION
RETURN @ERR
END
END
COMMIT TRANSACTION
DECLARE @RESULT INT
SELECT @RESULT = myField FROM myTable
PRINT @RESULT
DECLARE @RESULT nvarchar(1024)
EXECUTE sp_executesql N'SELECT @Result = ...', N'@Result nvarchar(1024) OUTPUT', @RESULT OUTPUT
PRINT @RESULT
DECLARE myCursor CURSOR FOR
SELECT myField FROM myTable
OPEN myCursor
FETCH NEXT FROM myCursor --← これを知らなくてハマった。@@FETCH_STATUSはOPEN直後が0であるとは限らないので、かならず1回実行してからLOOPに入ること。
WHILE @@FETCH_STATUS = 0
BEGIN
--処理
FETCH NEXT FROM myCursor
END
CLOSE myCursor
DEALLOCATE myCursor
所有権の継承の使用
EXECUTE
...権限
ストアド プロシージャの EXECUTE 権限は、特に指定のない限りストアド プロシージャの所有者に与えられます。EXECUTE 文字列内でステートメントを使用する権限は、そのステートメントがストアド プロシージャ内に含まれている場合でも、EXECUTE の実行直前にチェックされます。文字列を実行するストアド プロシージャが実行されるとき、権限は、プロシージャを作成したユーザーのコンテキストではなく、プロシージャを実行しているユーザーのコンテキストでチェックされます。しかし、ユーザーが 2 つのストアド プロシージャを所有しており、最初のプロシージャが 2 番目のプロシージャを呼び出すような場合、2 番目のストアド プロシージャに対して EXECUTE 権限がチェックされることはありません。